/*
 * ProductoDAO.java
 *
 * Created on 8 de marzo de 2007, 03:31 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.services.utilities.dao;

import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.services.base.constantes.ConstantesGenerales;
import com.src.computec.radar.services.utilities.dto.CicloDto;
import com.src.computec.radar.services.utilities.dto.ProductoDto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author aocampo
 */
public class CicloDAO extends GenericDAO implements BaseCicloDAO 
{
    private String SCHEMA = ConstantesGenerales.getInstance().SCHEMA;
    
    /** Creates a new instance of ProductoDAO */
    public CicloDAO() {
    }
    
    public List getCiclosByProducto(ProductoDto dto) throws DAOException 
    {
        List listCiclos = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_CLIENTE, CODIGO_PRODUCTO, CICLO, NOMBRE_CICLO " +
                                             "FROM " + SCHEMA + ".CICLO_PRODUCTO " +
                                             "WHERE CODIGO_CLIENTE = ? AND CODIGO_PRODUCTO = ? " +
                                             "ORDER BY NOMBRE_CICLO ASC");
            int indice = 0;
            statement.setObject(++indice, dto.getCodigoCliente());
            statement.setObject(++indice, dto.getCodigoProducto());
            rs = statement.executeQuery();
            while (rs.next()) 
            {
                indice = 0;
                CicloDto cicloDto = new CicloDto();
                cicloDto.setCodigoCliente(rs.getString(++indice));
                cicloDto.setCodigoProducto(rs.getString(++indice));
                cicloDto.setCiclo(rs.getString(++indice));
                cicloDto.setNombreCiclo(rs.getString(++indice));
                listCiclos.add(cicloDto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("CicloDAO:getCiclosByProducto: " + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return listCiclos;
    }
    
    public CicloDto getCicloByPrimaryKey(CicloDto dto) throws DAOException{
        CicloDto cicloDto = null;
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CI.CODIGO_CLIENTE, CI.CODIGO_PRODUCTO, CI.CICLO, CI.NOMBRE_CICLO, CLI.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO " +
                                             "FROM " + SCHEMA + ".CICLO_PRODUCTO CI " +
                                             "INNER JOIN " + SCHEMA + ".CLIENTE CLI ON CI.CODIGO_CLIENTE = CLI.CODIGO_CLIENTE " +
                                             "INNER JOIN " + SCHEMA + ".PRODUCTO P ON CI.CODIGO_CLIENTE = P.CODIGO_CLIENTE AND CI.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO " +
                                             "WHERE CI.CODIGO_CLIENTE = ? AND CI.CODIGO_PRODUCTO = ? AND CI.CICLO = ?");
            int indice = 0;
            statement.setObject(++indice, dto.getCodigoCliente());
            statement.setObject(++indice, dto.getCodigoProducto());
            statement.setObject(++indice, dto.getCiclo());
            rs = statement.executeQuery();
            if (rs.next()) {
                indice = 0;
                cicloDto = new CicloDto();
                cicloDto.setCodigoCliente(rs.getString(++indice));
                cicloDto.setCodigoProducto(rs.getString(++indice));
                cicloDto.setCiclo(rs.getString(++indice));
                cicloDto.setNombreCiclo(rs.getString(++indice));
                cicloDto.setNombreCliente(rs.getString(++indice));
                cicloDto.setNombreProducto(rs.getString(++indice));
            }
        } 
        catch (SQLException e) {
            throw new DAOException("CicloDAO:getCicloByPrimaryKey: " + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return cicloDto;
    }
    
    public List getCiclosDisponiblesForPlantillaByProducto(ProductoDto productodto) throws DAOException
    {
        List returnList = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_CLIENTE, CODIGO_PRODUCTO, CICLO, NOMBRE_CICLO " +
                                             "  FROM " + SCHEMA + ".CICLO_PRODUCTO " +
                                             " WHERE CODIGO_CLIENTE = ? AND CODIGO_PRODUCTO = ? " +
                                             "   AND CICLO NOT IN (SELECT CICLO " +
                                                                  "FROM " + SCHEMA + ".PLANTILLA_CICLO_PRODUCTO " +
                                                                  "WHERE CODIGO_CLIENTE = ? AND CODIGO_PRODUCTO = ?)");
            int indice1 = 0;
            statement.setString(++indice1, productodto.getCodigoCliente());
            statement.setString(++indice1, productodto.getCodigoProducto());
            statement.setString(++indice1, productodto.getCodigoCliente());
            statement.setString(++indice1, productodto.getCodigoProducto());
            rs = statement.executeQuery();
            
            while (rs.next()) {
                int indice = 0;
                CicloDto cicloDto = new CicloDto();
                cicloDto.setCodigoCliente(rs.getString(++indice));
                cicloDto.setCodigoProducto(rs.getString(++indice));
                cicloDto.setCiclo(rs.getString(++indice));
                cicloDto.setNombreCiclo(rs.getString(++indice));                
                returnList.add(cicloDto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("CicloDAO:getCiclosDisponiblesForPlantillaByProducto: " + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return returnList;
    }
}